package ltd.hellotrik.common.util;

import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class ReflectUtil {
	/* 该方法用于传入某实例对象以及对象方法名，通过反射调用该对象的某个get方法 */
	public static Object getProperty(Object beanObj, String fieldName) {
		try {
			Class<? extends Object> clazz = beanObj.getClass();
			PropertyDescriptor pd = new PropertyDescriptor(fieldName, clazz);
			Method getMethod = pd.getReadMethod();
			if (getMethod != null) {
				return getMethod.invoke(beanObj);
			}
		} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | IntrospectionException e) {
			e.printStackTrace();
		}
		return null;
	}

	/* 该方法用于传入某实例对象以及对象方法名、修改值，通过放射调用该对象的某个set方法设置修改值 */
	public static void setProperty(Object beanObj, Object value) {
		try {
			Field[] fields = beanObj.getClass().getDeclaredFields();// 获得属性
			@SuppressWarnings("unused")
            Class<? extends Object> clazz = beanObj.getClass();
			for (int i = 0; i < fields.length; i++) {
				Field field = fields[i];
				// 此处应该判断beanObj,property不为null
				PropertyDescriptor pd = new PropertyDescriptor(field.getName(), beanObj.getClass());
				Method setMethod = pd.getWriteMethod();
				if (setMethod != null) {
					System.out.println(
							beanObj + "的字段是:" + field.getName() + "，参数类型是：" + field.getType() + "，set的值是： " + value);
					// 这里注意实体类中set方法中的参数类型，如果不是String类型则进行相对应的转换
					setMethod.invoke(beanObj, value);// invoke是执行set方法
				}
			}
		} catch (SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | IntrospectionException e) {
			e.printStackTrace();
		}
	}

	public String upperCase(String str) {
		return str.substring(0, 1).toUpperCase() + str.substring(1);
	}
}
